package com.unionpay.acp.sdk;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.demoncat.util.exception.BizRuntimeException;
import cn.demoncat.util.lang.MapUtil;

/**
 * 接口服务类
 * 
 * @author 银联
 *
 * @since 2016-7-22
 */
public class AcpService {

	private static final Logger LOG = LoggerFactory.getLogger(AcpService.class);
	
	/**
	 * 请求报文签名
	 * 
	 * @param reqData	请求参数
	 * 
	 * @return 签名后的reqData
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年3月26日
	 */
	public static Map<String, String> sign(Map<String, String> reqData) {
		// 清除空元素，签名
		return SDKUtil.sign(MapUtil.clearEmpty(reqData));
	}
	
	/**
	 * 响应报文验签
	 * 
	 * @param rspData	响应数据
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年3月27日
	 */
	public static void validate(Map<String, String> rspData) {
		SDKUtil.validate(rspData);
	}
 
	/**
	 * 后台交易提交请求报文并接收同步应答报文

	 * @param map 	请求报文
	 * @param url  	请求地址
	 * 
	 * @return 应答http 200返回结果
	 */
	public static Map<String,String> post(Map<String, String> map,String url) {
		LOG.info("请求银联接口：url = {}, param = {}", url, map);
		// 连接超时，读取超时
		HttpClient hc = new HttpClient(url, 30000, 30000);
		// 发起请求
		int status = hc.send(map);
		// 解析结果
		if (200 == status) {
			// 读取响应
			map = SDKUtil.convertResultStringToMap(hc.getResult());
			// 校验响应
			if (MapUtil.isEmpty(map)) {
				throw new BizRuntimeException("请求银联失败：响应为空");
			}
			// 校验签名
			AcpService.validate(map);
			LOG.info("接收银联响应：code = {}, msg = {}", map.get(SDKConstants.param_respCode), map.get(SDKConstants.param_respMsg));
			return map;
		}else{
			throw new BizRuntimeException("请求银联失败：status = " + status);
		}
	}
	

}
